# 定义原始图片存放目录
original_images_dir = "原始图片"
# 定义CSV输出结果存放目录
csv_output_dir = "输出结果"
# 定义缓存目录，用于临时存储处理过程中的数据
cache_dir = ".cache"

import os


def get_filepaths(path=None, ext_types=('.jpg', '.png', '.JPG', '.PNG')):
    """
    获取具有指定扩展名的图片文件路径列表。

    :param path: 目录路径
    :param ext_types: 允许的图片文件扩展名元组，默认包括jpg和png两种格式。
    :return: 符合条件的图片文件完整路径列表。
    """

    # 如果目录不存在，则创建目录
    if path is not None and not os.path.exists(path):
        os.makedirs(path)

    # 读取原始图片目录下的所有文件
    files = os.listdir(path)

    # 过滤出符合扩展名条件的文件，并构造它们的完整路径
    filtered_files = [os.path.join(path, f)
                      for f in files if f.lower().endswith(ext_types)]
    return filtered_files


def get_cache_path_for_category(category):
    """
    确保特定类别的缓存目录存在，如果不存在则创建它，并返回该目录路径。

    :param category: 缓存目录的类别名称。
    :return: 特定类别的缓存目录路径。
    """

    # 拼接出完整的缓存目录路径
    category_path = os.path.join(cache_dir, category)
    # 如果目录不存在，则创建它
    if not os.path.exists(category_path):
        os.makedirs(category_path)
    return category_path


def get_cache_filepath(category, filename):
    """
    获取特定类别的某个文件路径。

    :param category: 缓存目录的类别名称。
    :param filename: 缓存文件的文件名。
    :return: 特定类别的缓存文件的完整路径。
    """

    # 拼接出完整的缓存文件路径
    return os.path.join(get_cache_path_for_category(category), filename)


def get_cache_files_in_category(category):
    """
    获取特定类别的缓存目录下的所有文件路径列表。

    :param category: 缓存目录的类别名称。
    :return: 该类别下所有文件的完整路径列表。
    """

    # 首先确保缓存目录存在，并获取该目录路径
    category_path = get_cache_path_for_category(category)
    # 读取该目录下的所有文件
    files = os.listdir(category_path)
    # 构造文件的完整路径列表
    files_in_category = [os.path.join(category_path, f) for f in files]
    return files_in_category


def get_output_csv_path():
    """
    获取CSV输出目录的路径。

    :return: CSV输出目录的路径。
    """
    return csv_output_dir


def get_parent_dir_name(filepath):
    """
    提取并返回指定文件路径的父目录名称。

    :param filepath: 文件的完整路径。
    :return: 文件父目录的名称。
    """

    # 获取文件的父目录路径
    parent_dir_path = os.path.dirname(filepath)
    # 从父目录路径中提取父目录的名称
    parent_dir_name = os.path.basename(parent_dir_path)
    return parent_dir_name


def filter_duplicate_filenames(list1, list2):
    """
    从第一个文件路径列表中移除与第二个列表中有相同不带扩展名的文件名的元素。

    参数:
        list1 (list): 第一个文件路径列表。
        list2 (list): 第二个文件路径列表。

    返回:
        list: 过滤后的第一个文件路径列表，其中不包含与第二个列表中有相同不带扩展名的文件名的元素。
    """

    # 提取 list2 中所有文件的不带扩展名的文件名
    filenames_without_extension_list2 = set(os.path.splitext(os.path.basename(path))[0] for path in list2)

    # 过滤 list1，只保留不带扩展名的文件名在 list2 中不存在的文件路径
    filtered_list1 = [path for path in list1
                      if os.path.splitext(os.path.basename(path))[0]
                      not in filenames_without_extension_list2]

    return filtered_list1
